Spring Security Note-11
Session管理
Session超时管理
1 | server.session.timeout=10 |
在设置了超时时间之后,等待片刻,重新刷新页面;
实际上发现,我们依然能够获取到用户的信息,session并没有清除;
在SpringBoot的源码当中,我们可以发现,默认最少超时时间是一分钟,所以我们设置的时间,应该要大于60秒;
在某些情况下,我们需要提示用户session失效,让用户重新登录;
添加配置
1 |
|
1 |
|
Session并发控制
添加配置
1 |
|
1 | public class ImoocExpiredSessionStrategy implements SessionInformationExpiredStrategy { |
重构
1 | public class SessionProperties { |
session失效以及并发控制的自定义的策略
1 | public class AbstractSessionStrategy { |
session超时的配置处理类
1 | public class ImoocExpiredSessionStrategy extends AbstractSessionStrategy implements SessionInformationExpiredStrategy { |
session失效的配置处理类
1 | public class ImoocInvalidSessionStrategy extends AbstractSessionStrategy implements InvalidSessionStrategy { |
1 |
|
配置注入Bean
1 |
|
集群Session管理
问题:
面对一个问题,任何一个软件在面向用户使用的时候,至少部署两台机器;
在集群环境下,基于Session的认证就会存在问题;
用户的登录请求发送到Server1时,登录成功后,所有的session等信息,存储在Server1中;
在后续用户发送的服务请求中, 如果在负载均衡上没有做出处理的话,请求可能会发送到Server2中;
那么当后面的请求发送到Server2上,在Server2中不存在用户的session等信息认证,那么Server2将会拒绝用户的服务请求,需要再次登录;
解决方案:
将session抽取出来,放在一个独立的存取中,不放在服务器上;
在Browser添加依赖
1 | <dependency> |
Spring Social提供的支持Session的类型
1 | public enum StoreType { |
配置
1 | # SESSION |
这样就能做到将session存储在redis中;
图形验证码
使ValidateCode实现Serializable接口,才能将图形验证码放入到session当中;
1 | public class ValidateCode implements Serializable{} |
不将图片放入session当中;
1 | /** |